1
2
3 package org.apache.lucene.queryparser.flexible.standard.parser;
4
5 import org.apache.lucene.queryparser.flexible.messages.Message;
6 import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
7 import org.apache.lucene.queryparser.flexible.core.*;
8 import org.apache.lucene.queryparser.flexible.core.messages.*;
9
10
11
12
13
14
15
16
17
18
19 public class ParseException extends QueryNodeParseException {
20
21
22
23
24
25
26 private static final long serialVersionUID = 1L;
27
28
29
30
31
32
33
34 public ParseException(Token currentTokenVal,
35 int[][] expectedTokenSequencesVal, String[] tokenImageVal) {
36 super(new MessageImpl(QueryParserMessages.INVALID_SYNTAX, initialise(
37 currentTokenVal, expectedTokenSequencesVal, tokenImageVal)));
38 this.currentToken = currentTokenVal;
39 this.expectedTokenSequences = expectedTokenSequencesVal;
40 this.tokenImage = tokenImageVal;
41 }
42
43
44
45
46
47
48
49
50
51
52
53 public ParseException() {
54 super(new MessageImpl(QueryParserMessages.INVALID_SYNTAX, "Error"));
55 }
56
57
58 public ParseException(Message message) {
59 super(message);
60 }
61
62
63
64
65
66
67
68 public Token currentToken;
69
70
71
72
73
74
75 public int[][] expectedTokenSequences;
76
77
78
79
80
81
82 public String[] tokenImage;
83
84
85
86
87
88
89
90
91 private static String initialise(Token currentToken,
92 int[][] expectedTokenSequences,
93 String[] tokenImage) {
94 String eol = System.getProperty("line.separator", "\n");
95 StringBuilder expected = new StringBuilder();
96 int maxSize = 0;
97 for (int i = 0; i < expectedTokenSequences.length; i++) {
98 if (maxSize < expectedTokenSequences[i].length) {
99 maxSize = expectedTokenSequences[i].length;
100 }
101 for (int j = 0; j < expectedTokenSequences[i].length; j++) {
102 expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
103 }
104 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
105 expected.append("...");
106 }
107 expected.append(eol).append(" ");
108 }
109 String retval = "Encountered \"";
110 Token tok = currentToken.next;
111 for (int i = 0; i < maxSize; i++) {
112 if (i != 0) retval += " ";
113 if (tok.kind == 0) {
114 retval += tokenImage[0];
115 break;
116 }
117 retval += " " + tokenImage[tok.kind];
118 retval += " \"";
119 retval += add_escapes(tok.image);
120 retval += " \"";
121 tok = tok.next;
122 }
123 retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
124 retval += "." + eol;
125 if (expectedTokenSequences.length == 1) {
126 retval += "Was expecting:" + eol + " ";
127 } else {
128 retval += "Was expecting one of:" + eol + " ";
129 }
130 retval += expected.toString();
131 return retval;
132 }
133
134
135
136
137 protected String eol = System.getProperty("line.separator", "\n");
138
139
140
141
142
143
144 static String add_escapes(String str) {
145 StringBuilder retval = new StringBuilder();
146 char ch;
147 for (int i = 0; i < str.length(); i++) {
148 switch (str.charAt(i))
149 {
150 case 0 :
151 continue;
152 case '\b':
153 retval.append("\\b");
154 continue;
155 case '\t':
156 retval.append("\\t");
157 continue;
158 case '\n':
159 retval.append("\\n");
160 continue;
161 case '\f':
162 retval.append("\\f");
163 continue;
164 case '\r':
165 retval.append("\\r");
166 continue;
167 case '\"':
168 retval.append("\\\"");
169 continue;
170 case '\'':
171 retval.append("\\\'");
172 continue;
173 case '\\':
174 retval.append("\\\\");
175 continue;
176 default:
177 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
178 String s = "0000" + Integer.toString(ch, 16);
179 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
180 } else {
181 retval.append(ch);
182 }
183 continue;
184 }
185 }
186 return retval.toString();
187 }
188
189 }
190